1.3 文件操作
🎯 学习目标
通过个人日记本项目,掌握Python文件操作和字符串处理
📝 项目预览:个人日记本
我们将创建一个能够记录、查看、搜索日记的程序,通过这个项目学习:
- 文件的读写操作
- 字符串处理和搜索
- 异常处理的完整流程
- 日期时间处理
- 程序功能的模块化设计
1. 文件操作基础
什么是文件操作?
文件操作就是让程序能够读取和写入计算机上的文件,就像我们用记事本记录文字一样。
打开文件
使用 open() 函数打开文件:
# 打开文件的基本语法
file = open("文件名", "模式", encoding="utf-8")文件打开模式
| 模式 | 说明 | 例子 |
|---|---|---|
"r" |
只读模式(默认) | 读取文件内容 |
"w" |
写入模式 | 创建新文件或清空原有内容 |
"a" |
追加模式 | 在文件末尾添加内容 |
"r+" |
读写模式 | 可以读取和写入 |
代码演示:基本文件操作
# 写入文件
with open("test.txt", "w", encoding="utf-8") as file:
file.write("这是我的第一行文字\n")
file.write("这是第二行文字\n")
# 读取文件
with open("test.txt", "r", encoding="utf-8") as file:
content = file.read()
print("文件内容:")
print(content)2. with语句的优势
为什么使用with语句?
with 语句可以自动管理文件的打开和关闭,避免忘记关闭文件:
# 传统方式(容易忘记关闭文件)
file = open("test.txt", "r")
content = file.read()
file.close() # 容易忘记这行
# 使用with语句(推荐)
with open("test.txt", "r") as file:
content = file.read()
# 文件会自动关闭3. 日记本中的文件操作
创建日记文件
import os
def create_diary_file():
"""创建日记文件"""
filename = "my_diary.txt"
# 检查文件是否存在
if not os.path.exists(filename):
with open(filename, "w", encoding="utf-8") as file:
file.write("=== 我的个人日记 ===\n")
file.write("=" * 30 + "\n\n")
print(f"已创建日记文件: {filename}")
else:
print(f"日记文件已存在: {filename}")
return filename添加日记条目
import datetime
def add_diary_entry(filename, content):
"""添加日记条目"""
# 获取当前时间
current_time = datetime.datetime.now()
timestamp = current_time.strftime("%Y年%m月%d日 %H:%M")
# 写入文件
with open(filename, "a", encoding="utf-8") as file:
file.write(f"【{timestamp}】\n")
file.write(content + "\n")
file.write("-" * 40 + "\n\n")
print("日记已保存!")4. 字符串处理
字符串常用操作
# 字符串基本操作
text = " Hello, World! "
print("原始字符串:", repr(text))
print("去除空格:", repr(text.strip()))
print("转换为大写:", text.upper())
print("转换为小写:", text.lower())
print("替换内容:", text.replace("World", "Python"))
print("查找位置:", text.find("Hello"))
print("分割字符串:", text.split(","))在日记本中的应用
def search_diary(filename, keyword):
"""搜索包含关键词的日记"""
try:
with open(filename, "r", encoding="utf-8") as file:
content = file.read()
# 统计关键词出现次数
count = content.count(keyword)
print(f"关键词 '{keyword}' 出现了 {count} 次")
# 查找包含关键词的行
lines = content.split('\n')
for i, line in enumerate(lines):
if keyword in line:
print(f"第{i+1}行: {line.strip()}")
except FileNotFoundError:
print("日记文件不存在!")5. 异常处理完整流程
完整的异常处理
def safe_file_operation(filename):
"""安全的文件操作"""
try:
# 尝试打开文件
with open(filename, "r", encoding="utf-8") as file:
content = file.read()
return content
except FileNotFoundError:
print("错误:文件不存在!")
return None
except PermissionError:
print("错误:没有文件访问权限!")
return None
except UnicodeDecodeError:
print("错误:文件编码问题!")
return None
except Exception as e:
print(f"未知错误: {e}")
return None日记本中的异常处理
def view_diary_safe(filename):
"""安全地查看日记"""
try:
with open(filename, "r", encoding="utf-8") as file:
content = file.read()
if content.strip(): # 检查内容是否为空
print(content)
else:
print("日记本是空的")
except FileNotFoundError:
print("日记文件不存在,请先创建日记本")
except Exception as e:
print(f"读取日记时出错: {e}")6. 日期时间处理
datetime模块的使用
import datetime
# 获取当前时间
now = datetime.datetime.now()
print("当前时间:", now)
print("年份:", now.year)
print("月份:", now.month)
print("日期:", now.day)
print("小时:", now.hour)
print("分钟:", now.minute)
# 格式化时间
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化时间:", formatted)
# 创建特定时间
def create_timestamp():
"""创建时间戳"""
now = datetime.datetime.now()
return now.strftime("【%Y年%m月%d日 %H:%M】")7. 程序模块化设计
功能模块划分
一个好的日记本程序应该这样组织:
# diary_functions.py - 功能函数模块
def create_file():
"""创建日记文件"""
pass
def add_entry():
"""添加日记"""
pass
def view_entries():
"""查看日记"""
pass
def search_entries():
"""搜索日记"""
pass
# diary_main.py - 主程序模块
def main_menu():
"""主菜单"""
pass
def main():
"""主程序"""
pass
if __name__ == "__main__":
main()日记本中的模块化设计
import os
import datetime
class DiaryManager:
"""日记管理器类"""
def __init__(self, filename="my_diary.txt"):
self.filename = filename
self.create_file_if_not_exists()
def create_file_if_not_exists(self):
"""如果文件不存在则创建"""
if not os.path.exists(self.filename):
with open(self.filename, "w", encoding="utf-8") as file:
file.write("=== 我的个人日记 ===\n")
file.write("=" * 30 + "\n\n")
def add_entry(self, content):
"""添加日记条目"""
timestamp = datetime.datetime.now().strftime("【%Y年%m月%d日 %H:%M】")
with open(self.filename, "a", encoding="utf-8") as file:
file.write(f"{timestamp}\n")
file.write(content + "\n")
file.write("-" * 40 + "\n\n")
print("日记保存成功!")📋 个人日记本完整代码解析
让我们看看项目中的关键代码:
import os
import datetime
def create_diary_file():
"""创建日记文件"""
filename = "my_diary.txt"
if not os.path.exists(filename):
with open(filename, "w", encoding="utf-8") as file:
file.write("=== 我的个人日记 ===\n")
file.write(f"创建时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
file.write("=" * 30 + "\n\n")
print(f"已创建日记文件: {filename}")
return filename
def add_new_entry(filename):
"""添加新日记"""
print("\n=== 写新日记 ===")
# 获取用户输入
content = input("请输入日记内容: ")
if content.strip(): # 检查是否输入了内容
timestamp = datetime.datetime.now().strftime("【%Y年%m月%d日 %H:%M】")
try:
with open(filename, "a", encoding="utf-8") as file:
file.write(f"{timestamp}\n")
file.write(content + "\n")
file.write("-" * 40 + "\n\n")
print("日记保存成功!")
except Exception as e:
print(f"保存失败: {e}")
else:
print("内容为空,取消保存")
def main():
"""主程序"""
diary_file = create_diary_file()
while True:
print("\n请选择功能:")
print("1. 写新日记")
print("2. 查看日记")
print("3. 退出")
choice = input("请输入选择 (1-3): ")
if choice == '1':
add_new_entry(diary_file)
elif choice == '2':
view_diary_entries(diary_file)
elif choice == '3':
print("感谢使用日记本,再见!")
break
else:
print("无效选择!")
if __name__ == "__main__":
main()🎯 学习要点总结
- 文件操作:
open(),read(),write(),close()的使用 - with语句:自动管理文件资源
- 字符串处理:
strip(),split(),find(),replace()等方法 - 异常处理:完整的
try-except错误处理流程 - 日期时间:
datetime模块的使用和时间格式化 - 模块化设计:合理的函数划分和程序结构
- 文件检查:
os.path.exists()检查文件是否存在 - 编码处理:使用
encoding='utf-8'处理中文
💡 练习建议
- 运行代码:打开
code/第一阶段/1.3_个人日记本.py体验功能 - 添加功能:尝试添加搜索、统计、备份等功能
- 改进界面:让菜单更友好,增加颜色提示
- 错误处理:完善各种异常情况的处理
- 数据持久化:尝试使用JSON格式存储日记
🚀 文件操作的重要性
- 数据持久化:程序关闭后数据不会丢失
- 数据交换:不同程序之间可以通过文件共享数据
- 日志记录:记录程序运行状态和用户操作
- 配置存储:保存程序设置和用户偏好
🚀 下一步
完成这个项目后,你已经掌握了Python编程的基础知识,可以继续学习:
- 第二阶段:数据处理与分析,使用NumPy和Pandas
- 第三阶段:机器学习基础,使用Scikit-learn
记住:文件操作是程序与外部世界沟通的桥梁,掌握好文件操作能让你的程序更实用!
学习愉快!多练习文件操作,这是编程中非常实用的技能!